package host

import (
	"context"

	"gitee.com/shiwjlinux/arm/common"
	"gitee.com/shiwjlinux/arm/ioc"
)

func GetService() Service {
	return ioc.Controller.Get(AppName).(Service)
}

type Service interface {
	CreateHost(context.Context, *CreateHostRequest) (*Host, error)
	QueryHost(context.Context, *QueryHostRequest) (*HostSet, error)
	UpdateHost(context.Context, *UpdateHostRequest) (*Host, error)
	DeleteHost(context.Context, *DeleteHostRequest) (*Host, error)
	DescribeHost(context.Context, *DescribeHostRequest) (*Host, error)
}

type (
	QueryHostRequest struct {
		*common.PageRequest
		Hostname string `json:"hostname"` // 主机名
		Keywords string `json:"keywords"` // 关键字
		Sn       string `json:"sn"`       // 序列号
	}

	UpdateHostRequest struct {
		Id string `json:"id"`
		*CreateHostRequest
	}
	DeleteHostRequest struct {
		Id string `json:"id" label:"required"` // 主机ID
	}
	DescribeHostRequest struct {
		Id string `json:"id" label:"required"` // 主机ID
	}
)

func NewQueryHostRequest() *QueryHostRequest {
	return &QueryHostRequest{
		PageRequest: common.NewPageRequest(),
	}
}

func (q *QueryHostRequest) WithSn(sn string) *QueryHostRequest {
	q.Sn = sn
	return q
}

func NewDescribeHostRequest(id string) *DescribeHostRequest {
	return &DescribeHostRequest{
		Id: id,
	}
}

func NewDeleteHostRequest(id string) *DeleteHostRequest {
	return &DeleteHostRequest{
		Id: id,
	}
}

func NewUpdateHostRequest(sn, hostname string) *UpdateHostRequest {
	return &UpdateHostRequest{
		CreateHostRequest: NewCreateHostRequest(sn, hostname),
	}
}

func NewUpdateHostRequestById(id string) *UpdateHostRequest {
	return &UpdateHostRequest{
		Id:                id,
		CreateHostRequest: NewCreateHostRequest("", ""),
	}
}

func (u *UpdateHostRequest) String() string {
	return common.ToJsonString(u)
}
